package bombita.persistencia;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jdom2.Element;

public class Deserializador
{
	/** Intenta instanciar la clase mencionada en el nombre del nodo,
	 * usando bombita.modelo como paquete base, y llamando al constructor
	 * que tiene a nodo como unico parametro.
	 * @throws ClassNotFoundException 
	 * @throws NoSuchMethodException 
	 * @throws SecurityException 
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException */
	public static Object deserializar(String base, Element nodo) throws Exception
	{
		String nombreClase = base + "." + nodo.getName();
		Class<? extends Object> clase = Class.forName(nombreClase);
		Method metodo = clase.getMethod("deserializar", Element.class);
		return metodo.invoke(null, nodo);
	}

	/** Extrae el primer descendiente que cumpla el regex y le aplica
	 * Deserializador.deserializar(base, descendiente)
	 * @throws ClassNotFoundException 
	 * @throws NoSuchMethodException 
	 * @throws SecurityException 
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException */
	public static Object deserializar(String base, Element padre, String regex) throws Exception
	{
		Pattern pattern = Pattern.compile(regex);
		Element seleccionado = null;
		for (Element hijo : padre.getChildren()) {
			Matcher matcher = pattern.matcher(hijo.getName());
			if (matcher.matches()) {
				seleccionado = hijo;
				break;
			}
		}
		return Deserializador.deserializar(base, seleccionado);
	}
}
